iT邦幫忙

2024 iThome 鐵人賽

DAY 21
0
Software Development

我命由我不由語言 java爬蟲挑戰系列 第 21

java爬蟲挑戰 Day 21 - 完成訂閱及解除訂閱的指令

  • 分享至 

  • xImage
  •  

今天的目標是實作 !sub!unsub 和部分 !info 指令,並且處理未知指令。這些指令的核心功能在於使用資料庫來記錄用戶的訂閱狀態,因此我們建立一個 SubscribeUser 的資料表來儲存相關資訊。

建立資料表存取訂閱狀態

建立 SubscribeUser

首先,我們建立一個簡單的 SubscribeUser 實體來儲存用戶的 userId 和 channelId及isSubscribe(訂閱狀態),以便記錄哪個用戶在哪個頻道訂閱了機器人推播。

@Entity
@Data
public class SubscribeUser {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    private String channelId;
    private String userId;
    private Boolean isSubscribe;
}

建立 SubscribeUserRepository

接著,建立 SubscribeUserRepository 來處理與資料庫的交互操作。我們只需要透過 userId 來查詢用戶的訂閱狀態。

public interface SubscribeUserRepository extends JpaRepository<SubscribeUser, Long> {
    SubscribeUser findByUserId(String userId);
}

處理Discord Bot 邏輯

DiscordBotListener 更新

增加了!sub、!unsub 和部分!info 指令,並且處理未知的指令。

@Override
public void onMessageReceived(MessageReceivedEvent event) {
    if (event.getAuthor().isBot())
        return;

    String message = event.getMessage().getContentRaw();
    if (message.startsWith("!")) {
        String channelId = event.getChannel().getId();
        log.info("所在頻道為: {}", channelId);
        String userId = event.getAuthor().getId();
        log.info("下指令者為: {}", userId);
        log.info("收到指令: {}", message);
        doBotCommand(message, channelId, userId);
    }
}

private void doBotCommand(String message, String channelId, String userId) {
    EmbedBuilder botResponeMessage;
    if (message.startsWith("!help")) {
        botResponeMessage = discordBotCommandService.helpCommand();
    } else if (message.startsWith("!sub")) {
        botResponeMessage = discordBotCommandService.subscribeCommand(userId, channelId);
    } else if (message.startsWith("!unsub")) {
        botResponeMessage = discordBotCommandService.unsubscribeCommand(userId);
    } else if (message.startsWith("!info")) {
        botResponeMessage = discordBotCommandService.showInfoCommand(userId);
    } else {
        botResponeMessage = discordBotCommandService.unKnowCommand();
    }
    discordBotService.sendMessage(channelId, botResponeMessage);
}

DiscordBotCommandServiceImpl 實作

接下來是今天的核心實作,包含訂閱、解除訂閱以及顯示用戶資訊的指令處理邏輯。

@Override
public EmbedBuilder subscribeCommand(String userID, String channel) {

    // 目前沒有多個訂閱的機制,每次更新都覆蓋掉之前的資料
    SubscribeUser subscribeUser = getOrNewSubscribeUser(userID, channel);
    subscribeUser.setIsSubscribe(true);
    subscribeUserRepository.save(subscribeUser);

    return stringToEmbed("訂閱成功");
}

@Override
public EmbedBuilder unsubscribeCommand(String userID) {

    SubscribeUser subscribeUser = getOrNewSubscribeUser(userID, "");
    subscribeUser.setIsSubscribe(false);
    subscribeUserRepository.save(subscribeUser);

    return stringToEmbed("解除訂閱成功");
}

@Override
public EmbedBuilder showInfoCommand(String userID) {
    SubscribeUser findByUserId = subscribeUserRepository.findByUserId(userID);
    if (Objects.nonNull(findByUserId) && findByUserId.getIsSubscribe()) {
        return stringToEmbed("目前有訂閱");
    } else {
        return stringToEmbed("目前無訂閱");
    }
}

private SubscribeUser getOrNewSubscribeUser(String userID, String channel) {
    SubscribeUser subscribeUser = subscribeUserRepository.findByUserId(userID);
    if (Objects.isNull(subscribeUser)) {
        subscribeUser = new SubscribeUser();
        subscribeUser.setUserId(userID);
        subscribeUser.setChannelId(channel);
    }
    return subscribeUser;
}

@Override
public EmbedBuilder unKnowCommand() {
    EmbedBuilder embedBuilder = stringToEmbed("未知的指令,請檢查指令後重新輸入,也可輸入`!help`確認指令。");
    embedBuilder.setColor(0xFF0000); // 紅色
    return embedBuilder;
}

展示

訂閱
https://ithelp.ithome.com.tw/upload/images/20240907/20168635APbSUVVs1X.png
查詢訂閱狀態
https://ithelp.ithome.com.tw/upload/images/20240907/20168635g1b0xxkOYs.png
解除訂閱
https://ithelp.ithome.com.tw/upload/images/20240907/20168635uC8QKzjnp2.png
查詢訂閱狀態
https://ithelp.ithome.com.tw/upload/images/20240907/201686350jtPxxxHXl.png
輸入未知指令
https://ithelp.ithome.com.tw/upload/images/20240907/201686355gEgo2035y.png

git現狀

https://ithelp.ithome.com.tw/upload/images/20240907/20168635mo56kkX8Xg.png

小結

今天完成了訂閱及解除訂閱的指令,並且已經成功把使用者的訂閱狀態寫在資料庫中了,明天我們繼續把剩下的指令完成。


上一篇
java爬蟲挑戰 Day 20 - 使用EmbedBuilder呈現!help指令
下一篇
java爬蟲挑戰 Day 22 - 完成設定租屋條件的指令
系列文
我命由我不由語言 java爬蟲挑戰30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言